package chapter07._02_CatchException;

import chapter07._01_ExceptionHanding.Test01_HowToThrowException;

import java.io.FileInputStream;
import java.io.IOException;
import java.net.UnknownHostException;
import java.nio.file.Path;
import java.util.Scanner;

/**
 * @Description: 捕获异常的基本方法
 * @LastDate: 2020/10/21
 */
public class Test01_Catching {

    public static void main(String[] args) {
        /*
        * 记住！！！
        * 子类不允许throws父类未列出的异常
        * 因此如果子类重写没有抛出异常的父类方法时
        * 需要在子类重写的方法中catch每个检查型异常
        * 不能throws父类没列出的异常
        * */
        Test01_Catching.readWithTryCatch("fundamentals/chapter07/_01_ExceptionHanding/Docs/input");
    }

    /*
    * 两种方法哪种更好呢？
    * 一般来说，选择捕获你知道要怎么处理的异常
    * 传递你不知道怎么处理的异常
    * */

    public static void readWithTryCatch(String fileName) {
        /*
        * 捕获异常 需要使用 try/catch代码块
        * 如果try代码块中任意一句抛出catch中指明的异常
        * 将会忽略剩下的try代码 进入catch执行代码
        * 如果try什么都没有发生 catch将不会执行
        * 如果抛出了catch没有指明的异常 方法会立即退出
        * */
        try {
            var in = new FileInputStream(fileName);
            int b;
            while ((b = in.read()) != -1) {
                //do something
            }
        } catch (IOException e) {
            e.getMessage();
        }
    }

    public void readWithThrowsException(String fileName) throws IOException {
        /*
         * 除了使用try/catch代码块捕获异常 还有更好的做法
         * 就是把异常留给调用者 让最终的调用者去担心处理这个问题
         * 这种做法需要你在方法首部声明可能抛出什么异常
         * */
        var in = new FileInputStream(fileName);
        int data;
        while ((data = in.read()) != -1) {
            //do something
        }
    }
}

class subClassThrowsException extends Test01_Catching {
    /*
    //error
    @Override
    public void readWithTryCatch(String fileName) throws FileNotFoundException {

    }*/

    /*
    * 此处有疑惑 书上说 不能throws超类方法未列出的异常
    * 但是这里列出了和父类不一样的异常 却没有报错
    * 所以应该是 重写没有throws的方法 不能throws
    * */
    @Override
    public void readWithThrowsException(String fileName) throws UnknownHostException {

    }
}
